﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Web.Mvc;
using System.Web.Security;
using System.Web;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;

namespace TicketsPhone.Web.Models
{
    /// <summary>
    /// Modelo de la pagina de autenticacion, cuando el usuario que se intenta autenticar no se encuentra registrado, retorna falso
    /// </summary>
    public class AutenticacionModel
    {
        [Required(ErrorMessage="Debe ingresar el usuario")]
        public string Username { get; set; }

        [Required(ErrorMessage = "Debe ingresar la clave")]
        public string Pass { get; set; }

        public bool EsUsuarioValido { get; set; }

    }

    /// <summary>
    /// Contiene la información básica de los usuarios
    /// </summary>
    public static class SesionModel
    {
        public static int IdUsuario { get { return int.Parse(HttpContext.Current.User.Identity.Name.Split(new char[] { '|' })[0]); } }
        public static string Email { get { return HttpContext.Current.User.Identity.Name.Split(new char[] { '|' })[1]; } }
        public static string NombreCompleto { get { return HttpContext.Current.User.Identity.Name.Split(new char[] { '|' })[2]; } }
        public static int IdEntidad { get { return int.Parse(HttpContext.Current.User.Identity.Name.Split(new char[] { '|' })[3]); } }
        public static int IdPerfil { get { return int.Parse(HttpContext.Current.User.Identity.Name.Split(new char[] { '|' })[4]); } }
        public static int IdSucursal { get { return int.Parse(HttpContext.Current.User.Identity.Name.Split(new char[] { '|' })[5]); } }

        public static int CajaActual {
            get { return new UsuarioRepositorio().ObtenerCajaActual(IdUsuario); }
        }
        
        /// <summary>
        /// Listado de permisos que tiene el perfil del usuario autenticado
        /// </summary>
        public static List<PermisosModulo> Permisos
        {
            get {

                if (HttpContext.Current.Session["Usuario_Permisos"] != null)
                {
                    return HttpContext.Current.Session["Usuario_Permisos"] as List<PermisosModulo>;
                }
                else
                {
                    PerfilRepositorio _perfil = new PerfilRepositorio();
                    HttpContext.Current.Session["Usuario_Permisos"] = _perfil.ObtenerTodosLosPermisos(SesionModel.IdPerfil);
                    return HttpContext.Current.Session["Usuario_Permisos"] as List<PermisosModulo>;
                }
                
            }
        }

        /// <summary>
        /// Valida si un usuario tiene permisos en determinado Modulo
        /// </summary>
        /// <param name="tipoPermiso">tipo de permiso que se desea consultar</param>
        /// <param name="modulo">Modulo actual</param>
        public static bool TienePermiso(TipoModulo modulo, TipoPermiso tipoPermiso)
        {
            return TienePermiso(modulo.ToString(), tipoPermiso);
        }

        /// <summary>
        /// Valida si un usuario tiene permisos en determinado Modulo
        /// </summary>
        /// <param name="tipoPermiso">tipo de permiso que se desea consultar</param>
        /// <param name="modulo">Modulo actual</param>
        public static bool TienePermiso(string modulo, TipoPermiso tipoPermiso)
        {
            PermisosModulo permiso = Permisos.Find(delegate(PermisosModulo p) { return p.Modulo.Nombre.Equals(modulo); });


            if (permiso != null)
            {                
                switch (tipoPermiso)
                {
                    case TipoPermiso.Listar:
                        return permiso.Listar;
                    case TipoPermiso.Crear:
                        return permiso.Crear;
                    case TipoPermiso.Editar:
                        return permiso.Editar;
                    case TipoPermiso.Eliminar:
                        return permiso.Eliminar;
                    default:
                        return false;
                }
            }
            else
            {
                return false;
            }

            
        }

        
    }


}
